package com.jincheng.system.service;

import com.jincheng.common.core.domain.AjaxResult;
import com.jincheng.common.core.domain.model.LoginUser;
import com.jincheng.system.domain.Activity;
import com.jincheng.system.domain.dto.*;
import com.jincheng.system.domain.vo.HeatMapVo;
import com.jincheng.system.domain.vo.UserActivityVo;

import java.util.List;
import java.util.Map;

/**
 * 活动Service接口
 *
 * @author DairyJay
 * @date 2024-12-21
 */
public interface IActivityService {
    /**
     * 查询活动
     *
     * @param activityId 活动主键
     * @return 活动
     */
    public Activity selectActivityByActivityId(Long activityId);

    /**
     * 查询活动
     *
     * @param activityIds 活动主键
     * @return 活动列表
     */
    public Activity selectActivityByActivityIds(List<Long> activityIds);

    /**
     * 查询活动列表
     *
     * @param activity 活动
     * @return 活动集合
     */
    public List<Activity> selectActivityList(Activity activity);

    /**
     * 查询活动列表
     *
     * @return 活动
     */
    List<ActivityDetailDTO> selectSimpleAll();

    /**
     * 查询活动列表
     *
     * @param activityScreenDTO 活动筛选信息
     * @return 活动集合
     */
    public List<ActivityDetailDTO> selectActivitySimpleList(ActivityScreenDTO activityScreenDTO);

    /**
     * 查询活动列表
     *
     * @param auditStatus 审核状态
     * @return 活动集合
     */
    public List<ActivitySimpleDTO> selectActivityListByUser(Long userId, Integer auditStatus);

    /**
     * 根据用户id查询活动积分总和
     *
     * @param userId 用户id
     * @return 积分总和
     */
    public Long selectIntegralSumByUserId(Long userId);

    /**
     * 新增活动
     *
     * @param activity 活动
     * @return 结果
     */
    public int insertActivity(Activity activity);

    /**
     * 修改活动
     *
     * @param activity 活动
     * @return 结果
     */
    public int updateActivity(Activity activity);

    /**
     * 批量删除活动
     *
     * @param activityIds 需要删除的活动主键集合
     * @return 结果
     */
    public int deleteActivityByActivityIds(Long[] activityIds);

    /**
     * 删除活动信息
     *
     * @param activityId 活动主键
     * @return 结果
     */
    public int deleteActivityByActivityId(Long activityId);


    /**
     * 根据筛选条件查询活动列表
     *
     * @param activityScreenDTO 数据查询DTO
     * @return 活动列表
     */
    List<ActivityDetailDTO> selectActivityListByScreen(ActivityScreenDTO activityScreenDTO);

    /**
     * 查询活动详情
     *
     * @param activityId 活动id
     * @return 活动详情
     */
    Map<String, Object> selectActivityDetail(Long activityId);

    /**
     * 报名活动
     *
     * @param activityId 活动id
     * @param loginUser  当前用户id
     * @return 是否报名成功
     */
    AjaxResult apply(Long activityId, LoginUser loginUser);

    /**
     * 根据用户id查询活动列表
     *
     * @return 活动列表
     */
    List<ActivitySimpleDTO> selectActivityListByUserId();

    /**
     * 获取活动统计信息
     *
     * @return 统计信息
     */
    ActivityStatisticsDTO getStatistics();

    /**
     * 获取活动热力图
     *
     * @param year 年份
     * @return 热力图
     */
    List<HeatMapVo> getHeatMap(Integer year);

    /**
     * 获取活动饼图
     *
     * @param type 类型
     * @return 饼图
     */
    List<PieChartDTO> getPie(String type);

    /**
     * 获取用户端的活动统计信息
     *
     * @return 活动统计信息
     */
    UserActivityVo getUserStatistics();

    /**
     * 根据年份获取当前用户参与的活动信息
     *
     * @param year 年份，0则为一年内
     * @return 日历热力图数据
     */
    Map<String, List<HeatMapVo>> getUserHeatMap(Integer year);

    /**
     * 根据用户id和活动状态查询活动列表
     *
     * @param userId         用户id
     * @param activityStatus 活动状态
     * @return 活动列表
     */
    List<ActivitySimpleDTO> selectActivityListByUserAndActivityStatus(Long userId, Integer activityStatus);

    /**
     * 活动扫码签到/签退
     *
     * @param verifyKey 二维码编号
     * @param userId    用户id
     * @return 签到/签退结果
     */
    String signInOrOutByQrCode(String verifyKey, Long userId);

    /**
     * 活动定位签到/签退
     *
     * @param userId     用户id
     * @param isSignIn   是否是签到
     * @param activityId 活动id
     * @return 签到/签退结果
     */
    String signInOrOut(Long userId, Boolean isSignIn, Long activityId);
}
